home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Makefiles / app / common.make < prev    next >
Text File  |  1995-02-14  |  18KB  |  523 lines

  1. ###############################################################################
  2. #  NeXT common.make
  3. #  Copyright 1992, NeXT Computer, Inc.
  4. #
  5. #  This makefile is common to all project-types (apps, subprojects,
  6. #  bundles, and palettes).  It can also prove useful to custom Makefiles
  7. #  needing generic project-building functionality, but users should be aware
  8. #  that interfaces supported at this level are private to the app makefiles
  9. #  and may change from release to release.
  10. #  
  11. ###############################################################################
  12.  
  13.  
  14. all::
  15.  
  16. SUPPORTFILES = IB.nproj Makefile makefile $(NAME).iconheader \
  17.     Makefile.preamble Makefile.postamble *.project
  18.  
  19. SRCFILES = $(CLASSES) $(MFILES) $(CFILES) \
  20.     $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) \
  21.     $(HFILES) $(PSWFILES) $(PSWMFILES) $(DBMODELAFILES) \
  22.     $(GLOBAL_RESOURCES) \
  23.     $(OTHERSRCS) $(OTHERLINKED) $(OTHER_SOURCEFILES)
  24.  
  25. ### Compute all the possible derived files and directories for them:
  26.  
  27. # Defaults for NeXT-specific Release Control options
  28. SRCROOT = .
  29. SYMROOT = .
  30. OBJROOT = .
  31. RC_ARCHS = `/usr/bin/arch`
  32. RC_CFLAGS = -arch `/usr/bin/arch`
  33.  
  34. # Directory for .o files (can be thrown away) 
  35. OFILE_DIR = $(OBJROOT)/$(ARCH_LIST)obj
  36. # Directory for all other derived files (contains symbol info. for debugging)
  37. SYM_DIR = $(SYMROOT)/sym
  38. # Directory for all public headers of the entire project tree
  39. LOCAL_HEADER_DIR = ./Headers/$(NAME)
  40. #PUBLIC_HEADER_DIR = ./Headers/$(NAME)
  41.  
  42. # For compatibility:
  43. DERIVED_DIR = $(OFILE_DIR)
  44. DERIVED_SRC_DIR = $(SYM_DIR)
  45.  
  46. $(OFILE_DIR) $(SYM_DIR) $(PUBLIC_HEADER_DIR):
  47.     @$(MKDIRS) $@
  48.  
  49. MSGOFILES = $(MSGFILES:.msg=Speaker.o) $(MSGFILES:.msg=Listener.o)
  50. MSGDERIVEDMFILES = $(MSGFILES:.msg=Speaker.m) $(MSGFILES:.msg=Listener.m)
  51.  
  52. ALLMIGFILES = $(MIGFILES) $(DEFSFILES)
  53.  
  54. MIGOFILES = $(MIGFILES:.mig=User.o) $(MIGFILES:.mig=Server.o)
  55. DEFSOFILES = $(DEFSFILES:.defs=User.o) $(DEFSFILES:.defs=Server.o)
  56. ALLMIGOFILES = $(MIGOFILES) $(DEFSOFILES)
  57.  
  58. MIGDERIVEDCFILES = $(MIGFILES:.mig=User.c) $(MIGFILES:.mig=Server.c)
  59. DEFSDERIVEDCFILES = $(DEFSFILES:.defs=User.c) $(DEFSFILES:.defs=Server.c)
  60. ALLMIGDERIVEDCFILES = $(MIGDERIVEDCFILES) $(DEFSDERIVEDCFILES)
  61.  
  62. EARLY_OFILES = $(PSWFILES:.psw=.o) $(PSWMFILES:.pswm=.o)
  63.  
  64. INITIAL_TARGETS = build_tools $(OFILE_DIR) $(SYM_DIR) $(EARLY_OFILES) $(MSGOFILES) $(ALLMIGOFILES) $(PRECOMPS) $(OTHER_INITIAL_TARGETS)
  65.  
  66. SUBPROJ_OFILES = $(SUBPROJECTS:.subproj=_subproj.o)
  67. OFILES = $(CLASSES:.m=.o) $(MFILES:.m=.o) $(CFILES:.c=.o) \
  68.     $(CCFILES:.cc=.o) $(CAPCFILES:.C=.o) $(CAPMFILES:.M=.o) \
  69.     $(CXXFILES:.cxx=.o) $(CPPFILES:.cpp=.o) $(EARLY_OFILES) \
  70.     $(SUBPROJ_OFILES) $(OTHERLINKEDOFILES) 
  71. #    Note: It would be nice to put $(OTHERRELOCATABLES) in this list someday
  72. #          when PB provides full paths for the contents of this variable.
  73.  
  74. # Derived resources:
  75. DBMODELS = $(DBMODELAFILES:.dbmodela=.dbmodel)
  76.  
  77. HELP_DIRS = Help
  78. HELP_STORES = $(HELP_DIRS:=.store) $(OTHER_HELP_DIRS:=.store)
  79.  
  80. ### Set defaults for many values used throughout the app Makefiles
  81.  
  82. # Default extension for bundles (directories containing object code and resources)
  83.  
  84. MAKEFILES = Makefile
  85.  
  86. PRODUCT_DEPENDS = $(OFILES) $(OTHER_OFILES) $(DBMODELS) \
  87.     $(ICONHEADER) $(APPICON) $(DOCICONS) $(MAKEFILES) \
  88.     $(OTHER_PRODUCT_DEPENDS)
  89.  
  90. GARBAGE = $(PSWFILES:.psw=.c) $(PSWMFILES:.pswm=.m) \
  91.     $(PSWFILES:.psw=.h) $(PSWMFILES:.pswm=.m) \
  92.     $(SYMROOT)/$(NAME).app $(SYMROOT)/$(NAME).debug \
  93.     $(SYMROOT)/$(NAME).profile $(SYMROOT)/$(NAME).$(BUNDLE_EXTENSION) \
  94.     $(SYMROOT)/$(NAME) $(SYMROOT)/$(NAME).palette \
  95.     $(SYMROOT)/lib$(NAME).a $(SYMROOT)/lib$(NAME).dylib \
  96.     $(OBJROOT)/*_obj $(SYM_DIR) *~ $(LANGUAGE).lproj/*~ \
  97.     Makefile.dependencies ./$(CHANGES_FILE) gmon.out \
  98.     $(PRECOMPS) $(OTHER_INITIAL_TARGETS) $(OTHER_GARBAGE)
  99.  
  100. # Default name for file to use as "reference time of last build"
  101. CHANGES_FILE = .lastBuildTime
  102.  
  103. # Defaults for who to chown executables to when installing
  104. INSTALL_AS_USER = root
  105. INSTALL_AS_GROUP = wheel
  106.  
  107. # Default compiler options
  108. PROJECT_SPECIFIC_CFLAGS = $(HEADER_PATHS) $(PB_CFLAGS) $(CFLAGS) $(OTHER_CFLAGS)
  109. PROJ_CFLAGS = $(PROJECT_SPECIFIC_CFLAGS)
  110. OPTIMIZATION_CFLAG = -O
  111. COMMON_CFLAGS = -g -Wall $(PROJECT_SPECIFIC_CFLAGS)   
  112. NORMAL_CFLAGS = $(COMMON_CFLAGS) $(OPTIMIZATION_CFLAG) 
  113. DEBUG_CFLAGS = $(COMMON_CFLAGS) -DDEBUG
  114. PROFILE_CFLAGS = $(COMMON_CFLAGS) -pg $(OPTIMIZATION_CFLAG) -DPROFILE
  115. OBJCFLAG = -ObjC
  116. C++CFLAGS = 
  117. # The flags to actually be used in this compilation:
  118. ALL_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR) $(RC_CFLAGS)
  119.  
  120. # Link editor options:
  121. ALL_LDFLAGS = $(LIBRARY_PATHS) $(PB_LDFLAGS) $(LDFLAGS) $(OTHER_LDFLAGS)
  122.  
  123. # Yacc options
  124. YFLAGS = -d
  125.  
  126. # Defaults strip options
  127. RELOCATABLE_STRIP_OPTS = -x -u
  128. DYLD_APP_STRIP_OPTS = -A -n
  129. APP_STRIP_OPTS =   # Set this to $(DYLD_APP_STRIP_OPTS) when doing dynaloading yourself
  130. TOOL_STRIP_OPTS =  # (ditto)
  131. LIBRARY_STRIP_OPTS = -x -S   # Note: -S strips debugging symbols
  132.  
  133. # Various commands:
  134. SHELL  = /bin/sh
  135. FASTCP = /usr/lib/fastcp
  136. CHANGES = /usr/lib/changes
  137. ARCH_TOOL = /usr/lib/arch_tool
  138. ARCHIFY = /usr/lib/arch_tool -archify_list
  139. CHOWN  = /etc/chown
  140. CHMOD  = /bin/chmod
  141. TAR    = /usr/bin/gnutar
  142. STRIP  = /bin/strip
  143. RM     = /bin/rm
  144. LN     = /bin/ln -s
  145. CP     = /bin/cp
  146. INSTALL_HEADERS_CMD = $(CP)
  147. ECHO   = /bin/echo
  148. MKDIRS = /bin/mkdirs
  149. TOUCH  = /usr/bin/touch
  150. AWK    = /bin/awk
  151. PSWRAP = /usr/bin/pswrap
  152. MSGWRAP = /usr/bin/msgwrap
  153. MIG    = /usr/bin/mig
  154. DBC    = /NextDeveloper/Apps/DBModeler.app/dbcompiler
  155. COMPRESSHELP = /usr/bin/compresshelp
  156. LIBTOOL = /bin/libtool
  157.  
  158. PUSHD = pushed_dir=`pwd` ; cd 
  159. POPD = cd $$pushed_dir
  160.  
  161. ADAPTOR_SEARCH_PATH = $(HOME)/Library/Adaptors /LocalLibrary/Adaptors /NextLibrary/Adaptors
  162.  
  163. DEFAULT_BUNDLE_EXTENSION = bundle
  164.  
  165. # Set VPATH via a variable so clients of common.make can reuse it when overriding VPATH
  166. NORMAL_VPATH = $(OFILE_DIR):$(SYM_DIR):$(LANGUAGE).lproj:$(PRODUCT_ROOT):$(PRODUCT_ROOT)/$(LANGUAGE).lproj
  167. VPATH = $(VPATH_PREAMBLE)$(NORMAL_VPATH)$(VPATH_POSTAMBLE)
  168.  
  169.  
  170. ### Use a set of basic suffix-style rules:
  171.  
  172. COMMON_APP_MAKEFILE_DIR = /NextDeveloper/Makefiles/app
  173. include $(COMMON_APP_MAKEFILE_DIR)/basicrules.make
  174.  
  175. ### Some utility definitions used throughout the PB Makefiles
  176.  
  177. process_target_archs = \
  178.     if [ -n "$(TARGET_ARCHS)" ] ; then \
  179.         archs="$(TARGET_ARCHS)" ; \
  180.         arch_cflags=`$(ARCHIFY) $$archs`; \
  181.     else \
  182.         archs="$(RC_ARCHS)" ; \
  183.         arch_cflags="$(RC_CFLAGS)" ; \
  184.     fi ; \
  185.     obj_dir=`$(ARCH_TOOL) -choose_obj_dir $$archs`
  186.  
  187. set_bundle_ext = \
  188.     if [ -z "$(BUNDLE_EXTENSION)" ] ; then \
  189.        bundle_ext=$(DEFAULT_BUNDLE_EXTENSION) ; \
  190.     else \
  191.        bundle_ext=$(BUNDLE_EXTENSION) ; \
  192.     fi 
  193.  
  194. set_language_cflags = \
  195.     if [ "$(ENGLISH)" = "YES" -o "$(JAPANESE)" != "YES" ] ; then \
  196.         language_cflags='' ; \
  197.     else \
  198.         language_cflags='-DKANJI' ; \
  199.     fi
  200.  
  201.  
  202. ### Define all the targets necessary at every level of the project-hierarchy:
  203.  
  204. # The following rules and rule fragments do the recursion into "sub" projects
  205. # of this project and does a 'make project' for each one in its
  206. # respective directories.  This insures that we do not rely on the directory
  207. # timestamp or "hack" file to know whether or not something has changed.  
  208.  
  209. CHANGES_COMMAND = $(CHANGES) $(TOP_PRODUCT_ROOT)/$(CHANGES_FILE) "$(OFILE_DIR)"
  210.  
  211. use_default_directory_args = \
  212.     top_prod_root=`echo $(TOP_PRODUCT_ROOT) | sed '/^[^/]/s:^:../:'` ; \
  213.     prod_root=`echo $(PRODUCT_ROOT) | sed '/^[^/]/s:^:../:'` ; \
  214.     ofile_dir=`echo $(OFILE_DIR) | sed '/^[^/]/s:^:../:'` ;\
  215.     sym_dir=`echo $(SYM_DIR) | sed '/^[^/]/s:^:../:'` 
  216.  
  217. use_absolute_directory_args = \
  218.       $(PUSHD) $(PRODUCT_ROOT) ; abs_prod_root=`pwd` ; $(POPD) ; \
  219.       prod_root=$$abs_prod_root ; \
  220.       $(PUSHD) $(TOP_PRODUCT_ROOT) ; abs_top_prod_root=`pwd` ; $(POPD) ; \
  221.       top_prod_root=$$abs_top_prod_root ; \
  222.       $(PUSHD) $(OFILE_DIR) ; abs_ofile_dir=`pwd` ; $(POPD) ; \
  223.       ofile_dir=$$abs_ofile_dir ; \
  224.       $(PUSHD) $(SYM_DIR) ; abs_sym_dir=`pwd` ; $(POPD) ; \
  225.       sym_dir=$$abs_sym_dir 
  226.  
  227. subprojs $(SUBPROJ_OFILES):
  228.     @(targets=`$(CHANGES_COMMAND) $(SUBPROJECTS)`;\
  229.     for ofile in $(SUBPROJ_OFILES) none ; do \
  230.        if [ $$ofile = "none" ] ; then break; fi ; \
  231.        if [ ! -f $(OFILE_DIR)/$$ofile ] ; then \
  232.           targets="$(SUBPROJECTS)" ; break; \
  233.        fi ; \
  234.     done ; \
  235.     $(use_default_directory_args) ;\
  236.     for sub in $$targets none ; do \
  237.        if [ $$sub = "none" ] ; then break; fi ;\
  238.        if [ -h $$sub ] ; then \
  239.         $(use_absolute_directory_args) ; \
  240.        fi ; \
  241.        $(PUSHD) $$sub; $(ECHO) Making $$sub ; \
  242.        $(MAKE) project \
  243.                   "PRODUCT_ROOT = $$prod_root" \
  244.                 "TOP_PRODUCT_ROOT = $$top_prod_root" \
  245.                "OFILE_DIR = $$ofile_dir/$$sub" \
  246.                "PRODUCT_PREFIX = $$ofile_dir/$$sub" \
  247.                "SYM_DIR = $$sym_dir/$$sub" \
  248.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  249.                "SRCROOT = $(SRCROOT)" \
  250.                "OBJROOT = $(OBJROOT)" \
  251.                "SYMROOT = $(SYMROOT)" \
  252.                "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$$sym_dir" \
  253.                "RC_ARCHS = $(RC_ARCHS)" \
  254.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  255.        $(POPD) ; $(ECHO) Finished making $$sub ; \
  256.     done )
  257.  
  258. bundles:
  259.     @(targets=`$(CHANGES_COMMAND) $(BUNDLES)` ; \
  260.     $(use_default_directory_args) ;\
  261.     for bun in $$targets none ; do \
  262.        if [ $$bun = "none" ] ; then break; fi ; \
  263.        if [ -h $$bun ] ; then \
  264.           $(use_absolute_directory_args) ; \
  265.        fi ; \
  266.        $(PUSHD) $$bun; $(ECHO) Making $$bun ; \
  267.        $(MAKE) project \
  268.                 "TOP_PRODUCT_ROOT = $$top_prod_root" \
  269.                        "BUNDLE_DIR = $$prod_root/$$bun" \
  270.                        "BUNDLE_PARENT_PRODUCT_DIR = $$prod_root" \
  271.                        "REL_BUNDLE_DIR = $$bun" \
  272.                "OFILE_DIR = $$ofile_dir/$$bun" \
  273.                "SYM_DIR = $$sym_dir/$$bun" \
  274.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  275.                "SRCROOT = $(SRCROOT)" \
  276.                "OBJROOT = $(OBJROOT)" \
  277.                "SYMROOT = $(SYMROOT)" \
  278.                "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$$sym_dir" \
  279.                "RC_ARCHS = $(RC_ARCHS)" \
  280.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  281.        $(POPD) ; $(ECHO) Finished making $$bun ; \
  282.     done )
  283.  
  284. tools:
  285.     @(targets=`$(CHANGES_COMMAND) $(TOOLS)` ; \
  286.     $(use_default_directory_args) ;\
  287.     for tool in $$targets none ; do \
  288.        if [ $$tool = "none" ] ; then break; fi ; \
  289.        if [ -h $$tool ] ; then \
  290.           $(use_absolute_directory_args) ; \
  291.        fi ; \
  292.        $(PUSHD) $$tool; $(ECHO) Making $$tool ; \
  293.        $(MAKE) project \
  294.                 "TOP_PRODUCT_ROOT = $$top_prod_root" \
  295.                        "PRODUCT_ROOT = $$prod_root" \
  296.                "OFILE_DIR = $$ofile_dir/$$tool" \
  297.                "SYM_DIR = $$sym_dir/$$tool" \
  298.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  299.                "SRCROOT = $(SRCROOT)" \
  300.                "OBJROOT = $(OBJROOT)" \
  301.                "SYMROOT = $(SYMROOT)" \
  302.                "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$$sym_dir" \
  303.                "RC_ARCHS = $(RC_ARCHS)" \
  304.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  305.        $(POPD) ; $(ECHO) Finished making $$tool ; \
  306.     done )
  307.  
  308. build_tools:
  309.     @(targets=`$(CHANGES_COMMAND) $(BUILD_TOOLS)` ; \
  310.     $(use_default_directory_args) ;\
  311.     for tool in $$targets none ; do \
  312.        if [ $$tool = "none" ] ; then break; fi ; \
  313.        if [ -h $$tool ] ; then \
  314.           $(use_absolute_directory_args) ; \
  315.        fi ; \
  316.        $(PUSHD) $$tool; $(ECHO) Making $$tool ; \
  317.        $(MAKE) project \
  318.                 "TOP_PRODUCT_ROOT = $$top_prod_root" \
  319.                        "PRODUCT_ROOT = $$prod_root" \
  320.                "OFILE_DIR = $$ofile_dir/$$tool" \
  321.                "SYM_DIR = $$sym_dir/$$tool" \
  322.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  323.                "SRCROOT = $(SRCROOT)" \
  324.                "OBJROOT = $(OBJROOT)" \
  325.                "SYMROOT = $(SYMROOT)" \
  326.                "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$$sym_dir" \
  327.                "RC_ARCHS = $(RC_ARCHS)" \
  328.                "RC_CFLAGS = $(RC_CFLAGS)" ; \
  329.        $(POPD) ; $(ECHO) Finished making $$tool ; \
  330.     done )
  331.  
  332. .bproj.strip .tproj.strip:
  333.     @(cd $<; \
  334.     $(MAKE) strip "DSTROOT = $(DSTROOT)" \
  335.               "PARENT_DIR = $(PARENT_DIR)" \
  336.               "NAME=$*")
  337.         
  338. strip:: strip_myself $(BUNDLES:.bproj=.strip) $(TOOLS:.tproj=.strip)
  339.  
  340. strip_myself::
  341.  
  342.  
  343. # The following rule insures that resources for this particular level in the project hierarchy get copied over to the appropriate place in the PRODUCT_ROOT.  Note that we depend on VPATH including $(LANGUAGE).lproj so that the LOCAL_RESOURCES are found correctly.  FASTCP is used to minimize the copying of files, since most resources are likely to be up to date most of the time.
  344.  
  345. resources:: $(LOCAL_RESOURCES) $(GLOBAL_RESOURCES) $(HELP_STORES) $(OTHER_RESOURCES)
  346.     @(if [ "$(PRODUCT_ROOT)" != "." ] ; then \
  347.         $(MKDIRS) $(PRODUCT_ROOT)/$(LANGUAGE).lproj ; \
  348.     fi ; \
  349.     if [ "$(LOCAL_RESOURCES)" != "" ] ; then \
  350.        locals="" ; \
  351.        for resource in $(LOCAL_RESOURCES) none ; do   \
  352.           insert="true"; \
  353.           for helpdir in $(HELP_DIRS) $(OTHER_HELP_DIRS) none ; do \
  354.              if [ "$$resource" = "$$helpdir" ] ; \
  355.                then insert="false"; \
  356.          fi ; \
  357.           done ; \
  358.           if [ "$$insert" = "true" ] ; then \
  359.              locals="$$locals $$resource" ; \
  360.           fi ; \
  361.        done ; \
  362.        $(FASTCP) $$locals $(PRODUCT_ROOT)/$(LANGUAGE).lproj ; \
  363.     fi ; \
  364.     if [ "$(GLOBAL_RESOURCES)" != "" ] ; then \
  365.        $(FASTCP) $(GLOBAL_RESOURCES) $(PRODUCT_ROOT) ; \
  366.     fi )
  367.  
  368.  
  369. # rules for copying, cleaning and making dependencies
  370.  
  371. .bproj.copy .subproj.copy .tproj.copy:
  372.     @(cd $<; $(MAKE) copy "NAME=$*" "DEST=$(DEST)/$<")
  373.  
  374. .bproj.clean .subproj.clean .tproj.clean:
  375.     @(echo Cleaning $<... ; cd $<; \
  376.       $(MAKE) clean "NAME=$*")
  377.  
  378. .bproj.depend .subproj.depend .tproj.depend:
  379.     @(sym_dir=`echo $(SYM_DIR) | sed '/^[^/]/s:^:../:'` ; \
  380.     cd $<; \
  381.     $(MAKE) depend "NAME=$*" \
  382.                "PROPOGATED_CFLAGS = $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$$sym_dir/$<" )
  383.  
  384. SRCROOT DEST:
  385.     @if [ -n "${$@}" ]; then exit 0; \
  386.     else $(ECHO) Must define $@; exit 1; fi
  387.  
  388. $(DEST)::
  389.     -$(RM) -rf $(DEST)
  390.     @$(MKDIRS) $(DEST)
  391.  
  392. $(NAME).copy:: DEST $(DEST) $(SRCFILES)
  393.     @(if [ "$(SRCFILES)" != "" ] ; then \
  394.            $(ECHO) "$(TAR) chf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -)" ; \
  395.            $(TAR) chf - $(SRCFILES) | (cd $(DEST); $(TAR) xf -) ; \
  396.     fi ; \
  397.     $(MKDIRS) $(DEST)/$(LANGUAGE).lproj ; \
  398.     if [ "$(LOCAL_RESOURCES)" != "" ] ; then \
  399.        $(ECHO) "(cd $(LANGUAGE).lproj; $(TAR) chf - $(LOCAL_RESOURCES)) | (cd $(DEST)/$(LANGUAGE).lproj; $(TAR) xf - )" ; \
  400.        (cd $(LANGUAGE).lproj; $(TAR) chf - $(LOCAL_RESOURCES)) | (cd $(DEST)/$(LANGUAGE).lproj; $(TAR) xf -) ; \
  401.     fi ; \
  402.     supportfiles="" ; \
  403.     for i in $(SUPPORTFILES) $(APPICON) $(DOCICONS) none ; do \
  404.         if [ -r $$i -a ! -r $(DEST)/$$i ] ; then \
  405.         supportfiles="$$supportfiles $$i" ; \
  406.         fi ; \
  407.     done ; \
  408.     if [ "$$supportfiles" != "" ] ; then \
  409.        $(ECHO) "$(TAR) chf - $$supportfiles | (cd $(DEST); $(TAR) xf -)" ; \
  410.        $(TAR) chf - $$supportfiles | (cd $(DEST); $(TAR) xf -) ; \
  411.     fi)
  412.  
  413. $(NAME).clean::
  414.     @if [ ! -w . ] ; then $(ECHO) '***' project write-protected; exit 1 ; fi
  415.     $(RM) -rf $(GARBAGE)
  416.  
  417.  
  418. # Build a set of dependencies for current level into Makefile.depndencies 
  419.    
  420. Makefile.dependencies:: $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) $(INITIAL_TARGETS)
  421.     @($(RM) -f Makefile.dependencies ; \
  422.     if [ "`$(ECHO) $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) | wc -w`" != "       0" ] ; then \
  423.         if [ "$(ENGLISH)" = "YES" -o "$(JAPANESE)" != "YES" ] ; then \
  424.             language_cflags="" ; \
  425.         else \
  426.             language_cflags="-DKANJI" ; \
  427.         fi ; \
  428.         $(ECHO) "$(CC) -MM $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR)  $$language_cflags $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) > Makefile.dependencies" ; \
  429.         $(CC) -MM $(PROJ_CFLAGS) $(PROPOGATED_CFLAGS) -I$(SYM_DIR)  $$language_cflags $(CLASSES) $(MFILES) $(CFILES) $(CCFILES) $(CAPCFILES) $(CAPMFILES) $(CXXFILES) $(CPPFILES) > Makefile.dependencies || ($(RM) -f Makefile.dependencies ; exit 1) ; \
  430.     fi );
  431.  
  432.         
  433.  
  434. copy:: $(NAME).copy $(BUNDLES:.bproj=.copy) \
  435.             $(SUBPROJECTS:.subproj=.copy) \
  436.             $(TOOLS:.tproj=.copy)
  437.  
  438. writable::
  439.     @chmod -R +w *
  440.  
  441. protected::
  442.     @chmod -R a-w *
  443.  
  444. installsrc:: SRCROOT
  445.     @($(MAKE) copy "DEST=$(SRCROOT)")
  446.  
  447. installhdrs_locally: headers
  448.  
  449. headers::
  450.     @($(MKDIRS) $(LOCAL_HEADER_DIR) ; \
  451.     $(PUSHD) $(LOCAL_HEADER_DIR) ; abs_local_hdr_dir=`pwd`; $(POPD); \
  452.     $(MAKE) $(NAME).installhdrs \
  453.                 "PUBLIC_HEADER_DIR = $$abs_local_hdr_dir" \
  454.                  "INSTALL_HEADERS_CMD = $(FASTCP)" \
  455.                     "RC_CFLAGS = $(RC_CFLAGS)" )
  456.              
  457. installhdrs::  
  458.     @($(MAKE) $(NAME).installhdrs \
  459.             "PUBLIC_HEADER_DIR = $(PUBLIC_HEADER_DIR)" \
  460.             "INSTALL_HEADERS_CMD = $(INSTALL_HEADERS_CMD)" \
  461.             "RC_CFLAGS = $(RC_CFLAGS)" )
  462.  
  463. $(NAME).installhdrs::
  464.     @(if [ -n "$(PUBLIC_HEADERS)" -a -n "$(PUBLIC_HEADER_DIR)" ] ; then \
  465.        $(MKDIRS) $(DSTROOT)$(PUBLIC_HEADER_DIR) ; \
  466.        cmd="$(INSTALL_HEADERS_CMD) $(PUBLIC_HEADERS) $(DSTROOT)$(PUBLIC_HEADER_DIR)" ; \
  467.        $(ECHO) $$cmd ; $$cmd ; \
  468.     fi ; \
  469.     for dir in $(BUNDLES) $(SUBPROJECTS) $(TOOLS) none ; do \
  470.        if [ $$dir = "none" ] ; then break; fi ; \
  471.        $(PUSHD) $$dir; $(ECHO) Installing headers for $$dir ; \
  472.        $(MAKE) $$dir.installhdrs "NAME = $$dir" \
  473.                 "PUBLIC_HEADER_DIR = $(PUBLIC_HEADER_DIR)" \
  474.                "INSTALL_HEADERS_CMD = $(INSTALL_HEADERS_CMD)" \
  475.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  476.                "SRCROOT = $(SRCROOT)" \
  477.                "OBJROOT = $(OBJROOT)" \
  478.                "SYMROOT = $(SYMROOT)" ; \
  479.        $(POPD) ; $(ECHO) Finished installing headers for $$dir ; \
  480.     done ; \
  481.     $(MAKE) after_installhdrs "NAME = $$dir" \
  482.                 "PUBLIC_HEADER_DIR = $(PUBLIC_HEADER_DIR)" \
  483.                "INSTALL_HEADERS_CMD = $(INSTALL_HEADERS_CMD)" \
  484.                "APP_MAKEFILE_DIR = $(APP_MAKEFILE_DIR)" \
  485.                "RC_CFLAGS = $(RC_CFLAGS)" \
  486.                "SRCROOT = $(SRCROOT)" \
  487.                "OBJROOT = $(OBJROOT)" \
  488.                "SYMROOT = $(SYMROOT)" )
  489.  
  490. after_installhdrs::
  491.     @(if [ -n "$(PUBLIC_PRECOMPILED_HEADERS)" -a -n "$(PUBLIC_HEADER_DIR)" ] ; then \
  492.        cd $(PUBLIC_HEADER_DIR) ; \
  493.        for header in $(PUBLIC_PRECOMPILED_HEADERS) none ; do \
  494.           if [ $$header = "none" ] ; then break; fi ; \
  495.           cd $(PUBLIC_HEADER_DIR) ; \
  496.           cmd="cc -precomp $(PUBLIC_PRECOMPILED_HEADERS_CFLAGS) $(RC_CFLAGS) $$header";\
  497.           $(ECHO) $$cmd ; $$cmd ; \
  498.        done ; \
  499.     fi)
  500.     
  501. clean:: 
  502.     @(if [ -z "$(BUNDLE_EXTENSION)" ] ; then \
  503.        bundle_ext=$(DEFAULT_BUNDLE_EXTENSION) ; \
  504.     else \
  505.        bundle_ext=$(BUNDLE_EXTENSION) ; \
  506.     fi ; \
  507.     if [ -n "$(CLEAN_ALL_SUBPROJECTS)" ] ; then \
  508.        $(MAKE) actual_clean really_clean \
  509.                             "BUNDLE_EXTENSION = $$bundle_ext" ; \
  510.     else \
  511.        $(MAKE) actual_clean "BUNDLE_EXTENSION = $$bundle_ext" ; \
  512.     fi )
  513.     
  514. actual_clean:: $(NAME).clean 
  515.  
  516. really_clean:: $(BUNDLES:.bproj=.clean) \
  517.      $(SUBPROJECTS:.subproj=.clean) \
  518.              $(TOOLS:.tproj=.clean)
  519.  
  520.  
  521.  
  522.  
  523.